package ig.metrica.riesgo;

import ig.finanzas.*;
import java.rmi.RemoteException;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Date;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import ig.metrica.ejb.bean.Productos;
import ig.metrica.ejb.html.GenerarHTML;
import ig.util.ConexionServer;
import ig.util.ejb.IGBean;
import ig.util.ejb.IGLlaveInt;
import ig.util.ejb.IGSessionBean;
import ig.util.excepciones.DatoInvalidoExcepcion;
import ig.util.excepciones.LogicaExcepcion;
import java.util.*;

public class CalculoRiesgoBeanMaCor extends IGSessionBean implements ICalculoRiesgoBussines {

    private GenerarHTML generarHTML = null;
    private Hashtable cambioesperadoMonedas = new Hashtable();
    private Collection<ZonaDTO> collection = new ArrayList();

    private boolean fechaInicioCerrada = false;
    


    public CalculoRiesgoBeanMaCor() {
    }

    public void setGenerarHTML(GenerarHTML generarHTML) {
        this.generarHTML = generarHTML;
    }

    public void ejbCreate() {
    }

    private MonedaBean getMoneda(MonedaPK monedaPK) throws NamingException, Exception {
        return new MonedaBean().ejbFindByPrimaryKey(monedaPK);
    }

    private Tasa getTasa(TasaPK tasaPK) throws NamingException, Exception {
        return new TasaBean().ejbFindByPrimaryKey(tasaPK);
    }

    private void _printHT(Hashtable ht, String name) {
        System.out.println("*******************");
        System.out.println("Name:" + name);
        Enumeration Key = ht.keys();
        while (Key.hasMoreElements()) {
            Object key = Key.nextElement();
            try {
                ig.metrica.riesgo.FactorRiesgoPersonalMetrica FACTOR = ((ig.metrica.riesgo.FactorRiesgoPersonalMetrica) ht.get(key));
                Byte TIPO = FACTOR.getTipo();
                String TASAPK = null;
                if (FACTOR.getTasaPK() != null) {
                    TASAPK = FACTOR.getTasaPK().toString();
                }
                Byte TIPO_CAL_ESP = FACTOR.getTipoCalculoCambioEsperado();
                String FACTOR_MATRIZ = FACTOR.getFactorRiesgoMatrizCorrelacion().getNombre();

                System.out.println(key.toString().trim() + "=TIPO:" + TIPO + ",TASAPK:" + TASAPK + ",TIPO_CAL_ESP:" + TIPO_CAL_ESP + ",FACTOR_MATRIZ:" + FACTOR_MATRIZ);
            } catch (Exception e) {
                String DATO = ((String) ht.get(key));
                System.out.println("DATO:" + DATO);
            }
        }
        System.out.println("*");
    }

    /**
     *
     * @param fecha
     * @param confPeriodos
     * @param numdias
     * @param relacionProductosFactores
     * @param relacionEspeciesFactores
     * @param relacionMonedasFactores
     * @throws DatoInvalidoExcepcion Si alguno de los parametros del metodo es nulo,
     * o si se especifico un factor tipo tasa para las acciones o uno tipo precio para los contratos simples.
     * o si alguno de los datos de la configuracion de los periodos de una banda es 0,
     * o si un dato es menor a su inmediatamente anterior.
     * @throws LogicaExcepcion Si no se definio Factor de Riesgo para algun producto, alguna especie o
     * para alguna moneda, si alguna de las formas de calculo del cambio esperado no permite obtener el valor, si no hay suficientes
     * valores en la serie, si la informacion hallada no alcanza a ser una muestra estadisticamente representativa,
     * o si la serie no permite el calculo utilizando diferencias logaritmicas.
     * O si al querer calcular el var de un contrato usando tasas este no tiene flujos para efectuar la operacion.
     * @throws NamingException Si se presento un error con JNDI.
     * @throws SQLException Si no se pueden encontrar los objetos en el servidor de aplicaciones.
     * @throws FinderException Si no se pueden encontrar los objetos en el servidor de aplicaciones.
     */
    public void efectuarCalculo(
            Date fecha,
            ManejadorBandas bandas,
            Hashtable relacionProductosFactores,
            Hashtable relacionEspeciesFactores,
            Hashtable relacionMonedasFactores) throws DatoInvalidoExcepcion, LogicaExcepcion, NamingException, SQLException, Exception {

        if (fecha == null) {
            generarHTML.println("La fecha especificada es nula.");
            throw new DatoInvalidoExcepcion("La fecha especificada es nula.");
        }
        if (relacionProductosFactores == null && relacionEspeciesFactores == null) {
            generarHTML.println("La relacion entre especies/productos y factores de riesgo es nula.");
            throw new DatoInvalidoExcepcion("La relacion entre especies y factores de riesgo es nula.");
        }
        if (relacionMonedasFactores == null) {
            generarHTML.println("La relacion entre monedas y factores de reisgo es nula.");
            throw new DatoInvalidoExcepcion("La relacion entre monedas y factores de reisgo es nula.");
        }
        cambioesperadoMonedas = new Hashtable();
        Properties prop_ = new Properties();
        prop_.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
        String Sockec = (new ConexionServer()).getSocketServer();
        prop_.put("java.naming.provider.url", Sockec);
        PreparedStatement pstmt4_ = null;
        Productos productos = null;
        try {
            conn = IGBean.getMetricaDB();//getConexion("METRICADB");
            pstmt1 = conn.prepareStatement("INSERT INTO VARCONTRATOSPRECIO(IDCONTRATO, VER, FACTORRIESGO, CAMBIOESPERADO) VALUES(?, ?, ?, ?)");
            pstmt2 = conn.prepareStatement("INSERT INTO VARCONTRATOSTASA(IDCONTRATO, VALORPRESENTE, DURACION, TIR, CAMBIOESPERADO, VER, FACTORRIESGO, IDBANDA) VALUES(?, ?, ?, ?, ?, ?, ?, ?)");
            pstmt3 = conn.prepareStatement("INSERT INTO CAMBIOESPERADOMONEDAS VALUES(?, ?)");
            
            PosicionAccionBean posicionAccionBean = new PosicionAccionBean();
            List contratos = posicionAccionBean.ejbFindAll();
            Iterator i = contratos.iterator();
            generarHTML.println((new StringBuilder()).append("Procesando :").append(contratos.size()).append(" Valores contrato").toString());
            int anterior = 0;
            do {
                if (!i.hasNext()) {
                    break;
                }
                PosicionAccionBean posicion = (PosicionAccionBean) i.next();
                //posicion.cargarEntidad();
                
                ProductoPK productoPK = posicion.getProductoPK();
                if (!relacionProductosFactores.containsKey(productoPK)) {
                    generarHTML.println((new StringBuilder()).append("Falta definir el factor de riesgo para el producto ").append(productoPK).toString());
                    throw new LogicaExcepcion((new StringBuilder()).append("Falta definir el factor de riesgo para el producto ").append(productoPK).toString());
                }
                FactorRiesgoPersonalMetrica factor = (FactorRiesgoPersonalMetrica) relacionProductosFactores.get(productoPK);
                double var = posicion.valorEnRiesgo(fecha, factor, true);
                String factorMatriz = factor.getFactorRiesgoMatrizCorrelacion().getNombre();
                Double cambioesperado = 0.0D;
                if (factor.getTipoCalculoCambioEsperado() == FactorRiesgoPersonalMetrica.CAMBIOESPERADO_FACTORMATRIZ) {
                    cambioesperado = factor.getFactorRiesgoMatrizCorrelacion().getCambioEsperado();
                } else {
                    try {
                        cambioesperado = posicion.cambioEsperadoValoresRegistrados(fecha, factor.getDefinidorCalculoCambioEsperado(), true);
                    } catch (Exception e) {
                        cambioesperado = null;
                        generarHTML.println(" Error: Factor:" + factor.getFactorRiesgoMatrizCorrelacion().getNombre());
                        generarHTML.println(" Posiciones Acciones:" + e.toString());
                    }
                }
                if (cambioesperado != null) {
                    pstmt1.setLong(1, posicion.getPk().getIdInterna());//varcontratosprecio
                    pstmt1.setDouble(2, var);
                    pstmt1.setString(3, factorMatriz);
                    pstmt1.setDouble(4, cambioesperado);                    
                    pstmt1.executeUpdate();
                }
                MonedaBean moneda = getMoneda(posicion.getMonedaPK());
                MonedaPK monedaPK = posicion.getMonedaPK();
                if (!cambioesperadoMonedas.containsKey(monedaPK)) {
                    if (!relacionMonedasFactores.containsKey(monedaPK)) {
                        generarHTML.println((new StringBuilder()).append("Falta definir el factor de riesgo para la moneda ").append(monedaPK).toString());
                        throw new LogicaExcepcion((new StringBuilder()).append("Falta definir el factor de riesgo para la moneda ").append(monedaPK).toString());
                    }
                    FactorRiesgoPersonalMetrica factorMoneda = (FactorRiesgoPersonalMetrica) relacionMonedasFactores.get(monedaPK);
                    Double cambioesperadoMoneda = 0.0D;
//                  public static final byte CAMBIOESPERADO_FACTORMATRIZ = 0;
//                  public static final byte CAMBIOESPERADO_SERIEVALORES = 1;                                        
                    Double ValorMonedaVigente = moneda.obtenerValorVigenteA(fecha);
                    if (factorMoneda.getTipoCalculoCambioEsperado() == FactorRiesgoPersonalMetrica.CAMBIOESPERADO_FACTORMATRIZ) {
                        cambioesperadoMoneda = factorMoneda.getFactorRiesgoMatrizCorrelacion().getCambioEsperado() * ValorMonedaVigente;
                    } else {
                        try {
                            cambioesperadoMoneda = moneda.cambioEsperadoValoresRegistrados(fecha, factorMoneda.getDefinidorCalculoCambioEsperado());
                            cambioesperadoMoneda = cambioesperadoMoneda * ValorMonedaVigente;
                        } catch (Exception e) {
                            cambioesperadoMoneda = null;
                            generarHTML.println(" Factor:" + factorMoneda.getFactorRiesgoMatrizCorrelacion().getNombre());
                            generarHTML.println(" Monedas:" + e.toString());
                        }
                    }
                    if (cambioesperadoMoneda != null) {
                        cambioesperadoMonedas.put(monedaPK, new Double(cambioesperadoMoneda));
                    }
                }
            } while (true);
            //ManejadorBandas bandas = ManejadorBandas.crearBandas(fecha, confPeriodos);
            int ahora = bandas.getColeccionBandas().size();
            if (anterior != ahora) {
                anterior = ahora;
                generarHTML.println((new StringBuilder()).append("Procesando :").append(anterior).append(" Bandas").toString());
            }
            pstmt4_ = conn.prepareStatement("INSERT INTO BANDASVAR VALUES(?,?,?) ");
            int contador = 0;
            Banda banda;
            for (i = bandas.getColeccionBandas().iterator(); i.hasNext(); banda.setIdInterna(contador)) {
                banda = (Banda) i.next();
                contador++;
                pstmt4_.setInt(1, contador);
                pstmt4_.setDate(2, new java.sql.Date(banda.getFechaInicio().getTime()));
                if (banda.getFechaFin() != null) {
                    pstmt4_.setDate(3, new java.sql.Date(banda.getFechaFin().getTime()));
                } else {
                    pstmt4_.setDate(3, null);
                }
                pstmt4_.executeUpdate();
            }

            contratos = new  ContratoSimpleBean().ejbFindAll();
            i = contratos.iterator();
            productos = new Productos();
            generarHTML.println((new StringBuilder()).append("Procesando :").append(contratos.size()).append(" Productos").toString());
            do {
                if (!i.hasNext()) {
                    break;
                }
                ContratoSimpleBean contrato = (ContratoSimpleBean) i.next();
                //contrato.cargarEntidad();
                
                ProductoPK productoPK = productos.getProductoPK(contrato.getPk().getIdInterna());
                if (productoPK != null) {
                    ManejadorFlujos flujosduracion = contrato.flujosParaDuracion(fecha);
                    if (!relacionProductosFactores.containsKey(productoPK)) {
                        generarHTML.println((new StringBuilder()).append("Falta definir el factor de riesgo para el producto ").append(productoPK).toString());
                        throw new LogicaExcepcion((new StringBuilder()).append("Falta definir el factor de riesgo para el producto ").append(productoPK).toString());
                    }
                    FactorRiesgoPersonalMetrica factor = (FactorRiesgoPersonalMetrica) relacionProductosFactores.get(productoPK);
                    TasaPK tasaPK = factor.getTasaPK();
                    
//                    if( tasaPK == null || tasaPK.getNombre()!=null || tasaPK.getNombre().trim().isEmpty() ){
//                        continue;
//                    }
//                    System.out.println((new StringBuilder()).append("Prodcuto:").append(productoPK).toString());
//                    System.out.println((new StringBuilder()).append("Tasa:").append(factor.getTasaPK()).toString());
//                    System.out.println((new StringBuilder()).append("Definidor cambio esperado:").append(factor.getDefinidorCalculoCambioEsperado()).toString());
//                    System.out.println((new StringBuilder()).append("Factor matriz:").append(factor.getFactorRiesgoMatrizCorrelacion().getNombre()).toString());
//                    System.out.println((new StringBuilder()).append("Tipo:").append(factor.getTipo()).toString());
//                    System.out.println((new StringBuilder()).append("Tipo calculo cambio esperado:").append(factor.getTipoCalculoCambioEsperado()).toString());
                    if (tasaPK == null) {
                        generarHTML.println("El factor de riesgo asociado al producto no es del tipo tasa");
                        throw new DatoInvalidoExcepcion("El factor de riesgo asociado al producto no es del tipo tasa");
                    }
                    String factorMatriz = factor.getFactorRiesgoMatrizCorrelacion().getNombre();
                    Tasa tasa = getTasa(tasaPK);
                    double cambioesperadoTasa;
//                  public static final byte CAMBIOESPERADO_FACTORMATRIZ = 0;
//                  public static final byte CAMBIOESPERADO_SERIEVALORES = 1;                                        
                    if (factor.getTipoCalculoCambioEsperado() == FactorRiesgoPersonalMetrica.CAMBIOESPERADO_FACTORMATRIZ) {
                        cambioesperadoTasa = factor.getFactorRiesgoMatrizCorrelacion().getCambioEsperado();
//                        cambioesperadoTasa = Math.pow(1.0D + cambioesperadoTasa / 10000D, 0.083333332999999996D) - 1.0D;
                        cambioesperadoTasa = cambioesperadoTasa / 10000D;
                    } else {
                        cambioesperadoTasa = tasa.cambioEsperadoValoresRegistrados(fecha, factor.getDefinidorCalculoCambioEsperado());
//                        cambioesperadoTasa = Math.pow(1.0D + cambioesperadoTasa / 10000D, 0.083333332999999996D) - 1.0D;

                    }

                    for (Iterator j = bandas.getColeccionBandas().iterator(); j.hasNext(); pstmt2.executeUpdate()) {
                        banda = (Banda) j.next();
                        ManejadorFlujos flujosintervalo = flujosduracion.flujosEntre(banda.getFechaInicio(), false, banda.getFechaFin(), true);

                        double valorpresente = flujosintervalo.valorDescontado(tasa, fecha, 0.0);
                        double duracion = flujosintervalo.duracion(fecha, tasa);
                        flujosintervalo.adicionarFlujo(new Flujo(fecha, valorpresente * -1D, 0.0D, 0.0D, false, false));
                        double tir = flujosintervalo.tir();
//                        System.out.println((new StringBuilder()).append("Contrato:").append(contrato.getPrimaryKey().toString()).toString());
//                        System.out.println((new StringBuilder()).append("tir:").append(tir).toString());
                        if (tir < 0.0D) {
                            System.out.println("La Tir es negativa");
                            tir = 0.0D;
                        }
//                            tir = Math.pow(1.0D + tir, 0.083333332999999996D) - 1.0D;
//                        System.out.println((new StringBuilder()).append("Math.pow:").append(tir).toString());
                        double var = ((valorpresente * duracion) / (1.0D + tir)) * cambioesperadoTasa;
                        pstmt2.clearParameters();

//                        GenerarHTML.gewInstace().println("---------------------------------------------------------------------");
//                        GenerarHTML.gewInstace().println("ID_CONTRATO C:"+ ((ContratoPK)contrato.getPrimaryKey()).getIdInterna());
                        pstmt2.setLong(1, contrato.getPk().getIdInterna());
                        pstmt2.setDouble(2, valorpresente);
                        pstmt2.setDouble(3, duracion);
                        pstmt2.setDouble(4, tir);
                        pstmt2.setDouble(5, cambioesperadoTasa);
                        pstmt2.setDouble(6, var);
                        pstmt2.setString(7, factorMatriz);
                        pstmt2.setLong(8, banda.getIdInterna());
                    }

                    MonedaBean moneda = getMoneda(contrato.getMonedaPK());
                    MonedaPK monedaPK = contrato.getMonedaPK();
                    if (!cambioesperadoMonedas.containsKey(monedaPK)) {
                        if (!relacionMonedasFactores.containsKey(monedaPK)) {
                            generarHTML.println((new StringBuilder()).append("Falta definir el factor de riesgo para la moneda ").append(monedaPK).toString());
                            throw new LogicaExcepcion((new StringBuilder()).append("Falta definir el factor de riesgo para la moneda ").append(monedaPK).toString());
                        }
                        FactorRiesgoPersonalMetrica factorMoneda = (FactorRiesgoPersonalMetrica) relacionMonedasFactores.get(monedaPK);
                        double cambioesperadoMoneda = 0.0D;
//                  public static final byte CAMBIOESPERADO_FACTORMATRIZ = 0;
//                  public static final byte CAMBIOESPERADO_SERIEVALORES = 1;       
                        Double ValorMonedaVigente = moneda.obtenerValorVigenteA(fecha);
                        if (factorMoneda.getTipoCalculoCambioEsperado() == FactorRiesgoPersonalMetrica.CAMBIOESPERADO_FACTORMATRIZ) {
                            cambioesperadoMoneda = factorMoneda.getFactorRiesgoMatrizCorrelacion().getCambioEsperado() * ValorMonedaVigente;
                        } else {
                            cambioesperadoMoneda = moneda.cambioEsperadoValoresRegistrados(fecha, factorMoneda.getDefinidorCalculoCambioEsperado());
                            cambioesperadoMoneda = cambioesperadoMoneda * ValorMonedaVigente;
                        }

                        cambioesperadoMonedas.put(monedaPK, new Double(cambioesperadoMoneda));
                    }
                }
            } while (true);
            productos.Finalizar();
            //PosicionEspecieHome home2 = (PosicionEspecieHome) ctx_.lookup("ig.finanzas.PosicionEspecie");
            contratos = new PosicionEspecieBean().ejbFindAll();
            i = contratos.iterator();
            generarHTML.println((new StringBuilder()).append("Procesando :").append(contratos.size()).append(" Contratos").toString());
            generarHTML.println("Procesando :Factores de riesgo");
            int t = 0;
            do {
                if (!i.hasNext()) {
                    break;
                }
                PosicionEspecieBean posicion = (PosicionEspecieBean) i.next();
                //posicion.cargarEntidad();
                /*Para pruebas de Eliecer*/
                System.out.println("El codigo del contrato es: " +  posicion.getPk().getIdInterna());
                EspeciePK especiePK = posicion.getEspeciePK();
                if (!relacionEspeciesFactores.containsKey(especiePK)) {
                    generarHTML.println((new StringBuilder()).append("Falta definir el factor de riesgo para la especie ").append(especiePK.toString()).toString());
                    throw new LogicaExcepcion((new StringBuilder()).append("Falta definir el factor de riesgo para la especie ").append(especiePK.toString()).toString());
                }
                FactorRiesgoPersonalMetrica factor = (FactorRiesgoPersonalMetrica) relacionEspeciesFactores.get(especiePK);
                if (factor.getTipo() == 0) {
                    double var = posicion.valorEnRiesgo(fecha, factor, false);

                     /*
                     * Ingresado por Cristhiam Reina
                     * 5 de marzo 2011
                     * nueva condicion
                     */
                    
                    if( (factor.getDefinidorCalculoCambioEsperado() != null) && (factor.getDefinidorCalculoCambioEsperado().getFormaCalculoCambioEsperado() != 0)
                        && (factor.getDefinidorCalculoCambioEsperado().getFormaCalculoCambioEsperado() == factor.getDefinidorCalculoCambioEsperado().FORMA_VALORACION_HISTORICA)){
                        var = var * 100;
                    }
                    String factorMatriz = factor.getFactorRiesgoMatrizCorrelacion().getNombre();
                    double cambioesperado = 0.0D;
//                  public static final byte CAMBIOESPERADO_FACTORMATRIZ = 0;
//                  public static final byte CAMBIOESPERADO_SERIEVALORES = 1;                    
                    if (factor.getTipoCalculoCambioEsperado() == FactorRiesgoPersonalMetrica.CAMBIOESPERADO_FACTORMATRIZ) {
                        cambioesperado = factor.getFactorRiesgoMatrizCorrelacion().getCambioEsperado();
                    } else {
                        cambioesperado = posicion.cambioEsperadoValoresRegistrados(fecha, factor.getDefinidorCalculoCambioEsperado(), false);
                    }
                    pstmt1.setLong(1, posicion.getPk().getIdInterna());
                    pstmt1.setDouble(2, Math.round(var * 100D) / 100L);
                    pstmt1.setString(3, factorMatriz);
                    pstmt1.setDouble(4, (double) Math.round(cambioesperado * 1000000D) / 1000000L);
                    pstmt1.executeUpdate();
                } else {
                    ManejadorFlujos flujosduracion = posicion.flujosParaDuracion(fecha);
                    TasaPK tasaPK = factor.getTasaPK();
                    if (tasaPK == null) {
                        generarHTML.println("El factor de riesgo asociado al producto no es del tipo tasa");
                        throw new DatoInvalidoExcepcion("El factor de riesgo asociado al producto no es del tipo tasa");
                    }
                    String factorMatriz = factor.getFactorRiesgoMatrizCorrelacion().getNombre();
                    Tasa tasa = getTasa(tasaPK);
                    double cambioesperadoTasa;
//                  public static final byte CAMBIOESPERADO_FACTORMATRIZ = 0;
//                  public static final byte CAMBIOESPERADO_SERIEVALORES = 1;                        
                    if (factor.getTipoCalculoCambioEsperado() == FactorRiesgoPersonalMetrica.CAMBIOESPERADO_FACTORMATRIZ) {
                        cambioesperadoTasa = factor.getFactorRiesgoMatrizCorrelacion().getCambioEsperado();
//                        cambioesperadoTasa = Math.pow(1.0D + cambioesperadoTasa / 10000D, 0.083333332999999996D) - 1.0D;
                        cambioesperadoTasa = cambioesperadoTasa / 10000D;
                    } else {
                        cambioesperadoTasa = tasa.cambioEsperadoValoresRegistrados(fecha, factor.getDefinidorCalculoCambioEsperado());
//                        cambioesperadoTasa = Math.pow(1.0D + cambioesperadoTasa, 0.083333332999999996D) - 1.0D;
                    }

                    for (Iterator j = bandas.getColeccionBandas().iterator(); j.hasNext(); pstmt2.executeUpdate()) {
                        banda = (Banda) j.next();
                        ManejadorFlujos flujosintervalo = flujosduracion.flujosEntre(banda.getFechaInicio(), false, banda.getFechaFin(), true);
                        double valorpresente = flujosintervalo.valorDescontado(tasa, fecha, 0.0);
                        double duracion = flujosintervalo.duracion(fecha, tasa);
                        flujosintervalo.adicionarFlujo(new Flujo(fecha, valorpresente * -1D, 0.0D, 0.0D, false, false));
                        double tir = flujosintervalo.tir();
//                        tir = Math.pow(1.0D + tir, 0.083333332999999996D) - 1.0D;
                        double var = valorpresente * (duracion / (1.0D + tir)) * cambioesperadoTasa;

//                        GenerarHTML.gewInstace().println("---------------------------------------------------------------------");
//                        GenerarHTML.gewInstace().println("ID_CONTRATO P:"+ ((ContratoPK)posicion.getPrimaryKey()).getIdInterna());
                        pstmt2.setLong(1, posicion.getPk().getIdInterna());
                        pstmt2.setDouble(2, Math.round(valorpresente * 100D) / 100L);
                        pstmt2.setDouble(3, (double) Math.round(duracion * 10000D) / 10000D);
                        pstmt2.setDouble(4, (double) Math.round(tir * 100000000D) / 100000000D);
                        pstmt2.setDouble(5, (double) Math.round(cambioesperadoTasa * 100000000D) / 100000000D);
                        pstmt2.setDouble(6, Math.round(var * 100D) / 100L);
                        pstmt2.setString(7, factorMatriz);
                        pstmt2.setLong(8, banda.getIdInterna());
                    }
                }
                MonedaBean moneda = getMoneda(posicion.getMonedaPK());
                MonedaPK monedaPK = posicion.getMonedaPK();
                if (!cambioesperadoMonedas.containsKey(monedaPK)) {
                    if (!relacionMonedasFactores.containsKey(monedaPK)) {
                        generarHTML.println((new StringBuilder()).append("Falta definir el factor de riesgo para la moneda ").append(monedaPK).toString());
                        throw new LogicaExcepcion((new StringBuilder()).append("Falta definir el factor de riesgo para la moneda ").append(monedaPK).toString());
                    }
                    FactorRiesgoPersonalMetrica factorMoneda = (FactorRiesgoPersonalMetrica) relacionMonedasFactores.get(monedaPK);
                    double cambioesperadoMoneda = 0.0D;
//                  public static final byte CAMBIOESPERADO_FACTORMATRIZ = 0;
//                  public static final byte CAMBIOESPERADO_SERIEVALORES = 1;
                    Double ValorMonedaVigente = moneda.obtenerValorVigenteA(fecha);
                    if (factorMoneda.getTipoCalculoCambioEsperado() == FactorRiesgoPersonalMetrica.CAMBIOESPERADO_FACTORMATRIZ) {
                        cambioesperadoMoneda = factorMoneda.getFactorRiesgoMatrizCorrelacion().getCambioEsperado() * ValorMonedaVigente;
                    } else {
                        cambioesperadoMoneda = moneda.cambioEsperadoValoresRegistrados(fecha, factorMoneda.getDefinidorCalculoCambioEsperado());
                        cambioesperadoMoneda = cambioesperadoMoneda * ValorMonedaVigente;
                    }
                    cambioesperadoMonedas.put(monedaPK, new Double(cambioesperadoMoneda));
                }
            } while (true);
            for (i = cambioesperadoMonedas.keySet().iterator(); i.hasNext(); pstmt3.executeUpdate()) {
                MonedaPK monedaPK = (MonedaPK) i.next();                
                pstmt3.setLong(1, monedaPK.getIdInterna());
                pstmt3.setDouble(2, ((Double) cambioesperadoMonedas.get(monedaPK)).doubleValue());
            }
        } catch (RemoteException e) {e.printStackTrace();
            throw new DatoInvalidoExcepcion(e.toString());
        } finally {
            try {
                pstmt1.close();
            } catch (Exception e) {
            }
            try {
                pstmt2.close();
            } catch (Exception e) {
            }
            try {
                pstmt3.close();
            } catch (Exception e) {
            }
            try {
                pstmt4_.close();
            } catch (Exception e) {
            }
            /*try {
                conn.close();
            } catch (Exception e) {
            }*/
            if (productos != null) {
                productos.Finalizar();
            }
        }

    }

    public void setZonas(Collection<ZonaDTO> collection) {
        this.collection = collection;
    }

    public boolean isFechaInicioCerrada() {
        return fechaInicioCerrada;
    }

    public void setFechaInicioCerrada(boolean fechaInicioCerrada) {
        this.fechaInicioCerrada = fechaInicioCerrada;
    }

    public void setFactores(Object get) {
        //throw new UnsupportedOperationException("Not supported yet.");
    }
}